﻿Imports WiremetModel.Entities.Tracking
Imports WiremetModel.Specification.GeneralSpecifications

Public Class OdpadyZleceniaView

    Private _unitOfWork As UnitOfWork
    Private _zlecenie As Zlecenie
    Private _selectedPozycjaZlecenia As PozycjaZlecenia
    Private _selectedSchemat As Schemat
    Private _selectedPozycjaSchematu As PozycjaSchematu

    Sub New(ByVal zlecenieId As Integer)

        InitializeComponent()
        _unitOfWork = New UnitOfWork()
        RefreshViewData(zlecenieId)
        RefreshPozycjaZleceniaTable(_zlecenie.PozycjeZlecenia.Values.OrderBy(Function(x) x.Wymiar))

    End Sub

    Private Sub OdpalyZleceniaForm_FormClosed(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosedEventArgs) Handles Me.FormClosed
        _unitOfWork.Dispose()
    End Sub


    Private Sub RefreshViewData(ByVal zlecenieId As Integer)

        Dim zlecenieRepository As New Repository(Of Zlecenie)(_unitOfWork)
        Dim zlecenieIdSpecification As New IdSpecification(Of Zlecenie)(zlecenieId)
        _zlecenie = zlecenieRepository.GetEntityMatching(zlecenieIdSpecification)

    End Sub


    Private Sub RefreshPozycjaZleceniaTable(ByVal pozycjeZlecenia As IEnumerable(Of PozycjaZlecenia))

        dgv_PozycjaZlecenia.Rows.Clear()

        For Each pozycjaZlecenia As PozycjaZlecenia In pozycjeZlecenia
            dgv_PozycjaZlecenia.Rows.Add(pozycjaZlecenia.Id,
                                         pozycjaZlecenia.Wymiar,
                                         pozycjaZlecenia.Ilosc)
        Next

    End Sub


    Private Sub RefreshSchematTable(ByVal schematy As IEnumerable(Of Schemat))

        dgv_Schemat.Rows.Clear()

        For Each schemat As Schemat In schematy

            dgv_Schemat.Rows.Add(schemat.Id,
                                 schemat.Ilosc,
                                 schemat.MaterialyProdukcyjne.Sum(Function(x) x.Ilosc),
                                 schemat.Pracownik.Nazwisko & " " & schemat.Pracownik.Imie)
        Next

    End Sub

    Private Sub RefreshPozycjaSchematuTable(ByVal pozycjeSchematu As IEnumerable(Of PozycjaSchematu))

        dgv_PozycjaSchematu.Rows.Clear()

        For Each pozycjaSchematu As PozycjaSchematu In pozycjeSchematu

            dgv_PozycjaSchematu.Rows.Add(pozycjaSchematu.Id,
                                         If(pozycjaSchematu.GrupaMaszyny Is Nothing, String.Empty, pozycjaSchematu.GrupaMaszyny.Nazwa),
                                         pozycjaSchematu.OpcjaPozycjiSchematu.Nazwa,
                                         pozycjaSchematu.Pracownik.Nazwisko & " " & pozycjaSchematu.Pracownik.Imie,
                                         pozycjaSchematu.WymiarWejsciowy,
                                         pozycjaSchematu.WymiarKoncowy,
                                         pozycjaSchematu.Status.Nazwa,
                                         pozycjaSchematu.Druty.Values.SelectMany(Function(x) x.Rodzice).Sum(Function(x) x.Waga))
        Next

    End Sub


    Private Sub RefreshDrutTable(ByVal druty As IEnumerable(Of Drut))

        dgv_Drut.Rows.Clear()

        For Each drut As Drut In druty

            dgv_Drut.Rows.Add(drut.Id,
                              drut.Maszyna.Nazwa,
                              drut.Opcja.Nazwa,
                              drut.Pracownik.Nazwisko & " " & drut.Pracownik.Imie,
                              drut.Rodzice.Sum(Function(x) x.Waga))

        Next

    End Sub

    Private Function AggregateDrutByOpcja(ByVal drutList As IEnumerable(Of Drut)) As Dictionary(Of Opcja, Double)

        Dim result As New Dictionary(Of Opcja, Double)

        For Each drut As Drut In drutList

            If Not result.ContainsKey(drut.Opcja) Then
                result.Add(drut.Opcja, 0)
            End If

            result(drut.Opcja) += drut.Rodzice.Sum(Function(x) x.Waga)
        Next
        Return result

    End Function


    Private Sub RefreshOpcjaAggregateTable(ByVal data As Dictionary(Of Opcja, Double))

        dgv_OpcjaAggregate.Rows.Clear()

        For Each pair As KeyValuePair(Of Opcja, Double) In data

            dgv_OpcjaAggregate.Rows.Add(pair.Key.Nazwa, pair.Value)

        Next

    End Sub


    Private Sub EnsureSelectionNotEmpty(ByRef dataGridView As DataGridView)

        If dataGridView.SelectedRows.Count = 0 Then
            Throw New Exception("Proszę, wybierz rekord, aby kontynuować.")

        End If


    End Sub



    Private Sub dgv_PozycjaZlecenia_CellClick(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles dgv_PozycjaZlecenia.CellClick

        Try
            EnsureSelectionNotEmpty(dgv_PozycjaZlecenia)

            Dim pozycjaZleceniaId As Integer = CInt(dgv_PozycjaZlecenia.SelectedRows(0).Cells("PozycjaZleceniaId").Value)
            Dim pozycjaZlecenia As PozycjaZlecenia = _zlecenie.PozycjeZlecenia(pozycjaZleceniaId)
            _selectedPozycjaZlecenia = pozycjaZlecenia
            RefreshSchematTable(pozycjaZlecenia.Schematy.Values)
            RefreshOpcjaAggregateTable(AggregateDrutByOpcja(pozycjaZlecenia.Schematy.Values.SelectMany(Function(x) x.PozycjeSchematu.Values).SelectMany(Function(x) x.Druty.Values)))

        Catch ex As Exception
            MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error)
        End Try

    End Sub

    Private Sub dgv_Schemat_CellClick(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles dgv_Schemat.CellClick
        Try

            EnsureSelectionNotEmpty(dgv_Schemat)

            Dim schematId As Integer = CInt(dgv_Schemat.SelectedRows(0).Cells("SchematId").Value)
            Dim schemat As Schemat = _selectedPozycjaZlecenia.Schematy(schematId)
            _selectedSchemat = schemat
            RefreshPozycjaSchematuTable(schemat.PozycjeSchematu.Values)
            RefreshOpcjaAggregateTable(AggregateDrutByOpcja(schemat.PozycjeSchematu.Values.SelectMany(Function(x) x.Druty.Values)))

        Catch ex As Exception
            MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error)
        End Try
    End Sub

    Private Sub dgv_PozycjaSchematu_CellClick(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles dgv_PozycjaSchematu.CellClick
        Try
            EnsureSelectionNotEmpty(dgv_PozycjaSchematu)

            Dim pozycjaSchematuId As Integer = CInt(dgv_PozycjaSchematu.SelectedRows(0).Cells("PozycjaSchematuId").Value)
            Dim pozycjaSchematu As PozycjaSchematu = _selectedSchemat.PozycjeSchematu(pozycjaSchematuId)
            _selectedPozycjaSchematu = pozycjaSchematu
            RefreshDrutTable(pozycjaSchematu.Druty.Values)
            RefreshOpcjaAggregateTable(AggregateDrutByOpcja(pozycjaSchematu.Druty.Values))

        Catch ex As Exception
            MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error)
        End Try
    End Sub

    Private Sub dgv_Drut_CellClick(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles dgv_Drut.CellClick
        Try

        Catch ex As Exception
            MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error)
        End Try
    End Sub

End Class